package com.example.d8_thread_pool;

import java.util.concurrent.*;

/**
 * 目标：线程池的创建 - 处理Callable任务
 */
public class ThreadPoolTest2 {
    public static void main(String[] args) throws Exception {
        // 1.通过ThreadPoolExecutor创建一个线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3, // 核心线程数有3个
                5, // 最大线程数有5个   临时线程数 = 最大线程数 - 核心线程数 = 5 - 3 = 2
                8, // 临时线程存活的时间8秒 意思是临时线程8秒没有任务执行,就会被销毁掉
                TimeUnit.SECONDS, // 时间单位（秒）
                new ArrayBlockingQueue<>(4), // 任务阻塞队列,没有来得及执行的任务在,任务队列中等待
                Executors.defaultThreadFactory(), // 用于创建线程的工厂对象
                new ThreadPoolExecutor.CallerRunsPolicy()); // 任务的拒绝策略

        // 2.使用线程处理Callable任务
        // Future<?> submit(Runnable task) 执行Callable任务,返回未来任务对象,用于获取线程的返回结果
        Future<String> f1 = pool.submit(new MyCallable(100));
        Future<String> f2 = pool.submit(new MyCallable(200));
        Future<String> f3 = pool.submit(new MyCallable(300));
        Future<String> f4 = pool.submit(new MyCallable(400));

        // 3.获取任务的执行结果
        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
    }
}
